package futbol.tacticas.concursantes2007.JavierGon;

import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoPase;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;
import futbol.tacticas.concursantes.Tactica;

import java.awt.Color;
import java.awt.Point;
import java.util.Vector;


public class TacticaJavierGon implements Tactica{
    private int jugadores[][]={
        {-152,0,5},                    
        {-120,15,6},                   
        {-120,-15,6},                 
        {-100,40,6},                 
        {-100,-40,6},                
        {-40,0,6},                   
       {-20,30,6},                  
        {-20,-30,6},               
        {105,-40,7} ,               
        {110,0,6},                
        {100,40,7}               
    };
    
   
    public String getNombre() {
        return "JavierGon";
    }
    
    public Color getColor1() {
        return Color.BLUE;
    }
    
    public Color getColor2() {
        return Color.BLACK;
    }
    
    public Color getColorNumero() {
        return Color.RED;
    }
    
    public int getFuerza(int n){
        return jugadores[n][2];
    }
    
    public int getXInicial(int n){
        return jugadores[n][0];
    }
    
    public int getYInicial(int n){
        return jugadores[n][1];
    }
    
    Vector<Comando> comandos=new Vector();
    Point[] contrarios;
    Point[] actualMios;
    Point bola;
    java.util.Random rnd=new java.util.Random();
    Point[] vctr;
    Vector ocupado=new Vector();
    public Vector<Comando> getComandos(SituacionJugadores sj) {
        comandos.clear();
        ocupado.clear();
        contrarios =sj.getContrario();
        bola=sj.getBola();
        actualMios=sj.getMisJugadores();
        
        int y=(int)(bola.getY()/2);
        if (y<-25) y=-25;
        if (y>25) y=25;
        comandos.add(new ComandoIrA(0,jugadores[0][0], y));
        
        vctr=jugadoresEn(-160,-60,contrarios);
        if (vctr.length>0){
            int[] mios = { 1,2, 3, 4};
            int jugCubre;
            for (int n=0;n<vctr.length;n++){
                jugCubre=contrariosCerca(vctr[n],mios);
                Point ubica=calculaPosicion(vctr[n]);
                comandos.add(new ComandoIrA(jugCubre,ubica.getX(),ubica.getY()));
            }
            for (int n=1;n<5;n++)
                if (!ocupado.contains(n))
                    comandos.add(new ComandoIrA(n,jugadores[n][0],jugadores[n][1]));
        } else{
            for (int n=1;n<5;n++){
                comandos.add(new ComandoIrA(n,jugadores[n][0],jugadores[n][1]));
            }
        }
        ocupado.clear();
       
        vctr=jugadoresEn(-70,30,contrarios);
        if (vctr.length>0){
            int[] mios = { 5,6, 7};
            int jugCubre;
            for (int n=0;n<vctr.length;n++){
                jugCubre=contrariosCerca(vctr[n],mios);
                Point ubica=calculaPosicion(vctr[n]);
                comandos.add(new ComandoIrA(jugCubre,ubica.getX(),ubica.getY()));
            }
            for (int n=5;n<8;n++)
                if (!ocupado.contains(n))
                    comandos.add(new ComandoIrA(n,jugadores[n][0],jugadores[n][1]));
            
        } else{
            for (int n=5;n<8;n++)
                comandos.add(new ComandoIrA(n,jugadores[n][0],jugadores[n][1]));
        }
        ocupado.clear();
        
        vctr=jugadoresEn(70,150,contrarios);
        if (vctr.length>0){
            for (int n=0;n<vctr.length;n++){
                Point ubica=calculaPosicion(vctr[n]);
                comandos.add(new ComandoIrA(((n+8)>10)?10:n+8,ubica.getX(),ubica.getY()));
            }
        } else{
            for (int n=8;n<11;n++){
                comandos.add(new ComandoIrA(n,jugadores[n][0],jugadores[n][1]));
            }
        }
        
        
        int siguienteJugador=sj.getSiguienteJugador(sj.getMasCercanoDeBola());
        siguienteJugador=(siguienteJugador==-1)?10:siguienteJugador;
        comandos.add(new ComandoIrA(sj.getMasCercanoDeBola(),bola.getX(),bola.getY()));
        comandos.add(new ComandoIrA(siguienteJugador,bola.getX(),bola.getY()));
        
        for (int n=0;n<5;n++)
            if (actualMios[n].getX()<0)
                comandos.add(new ComandoTiroAPuerta(n,30));
            else
                comandos.add(new ComandoTiroAPuerta(n,-30));
        
        for (int n=5;n<8;n++)
            comandos.add(new ComandoTiroAPuerta(n,rnd.nextInt(30)-15));
        
        for (int n=8;n<11;n++){
            if ((int)bola.getX()==0 && (int)bola.getY()==0)
                comandos.add(new ComandoPase(n,4));
            else
                if (actualMios[n].getX()<0)
                    comandos.add(new ComandoTiroAPuerta(n,16));
                else
                    comandos.add(new ComandoTiroAPuerta(n,-16));
        }
        return comandos;
    }
  
    private Point[] jugadoresEn(double xIzq,double xDer,Point jugs[]){
        Vector<Point> vctr=new Vector();
        for (int i=0;i<jugs.length;i++){
            if (jugs[i].getX()>xIzq && jugs[i].getX()<xDer)
                vctr.add(jugs[i]);
        }
        Point[] r=new Point[vctr.size()];
        for (int i=0;i<vctr.size();i++)
            r[i]=vctr.get(i);
        
        return r;
    }
    

    private Point calculaPosicion(Point jug){
        double xR=bola.getX();
        double yR=bola.getY();
        if (jug.getX()> bola.getX())
            xR=jug.getX()-8;
        else
            xR=jug.getX()+8;
        if (jug.getY()> bola.getY())
            yR=jug.getY()-8;
        else
            yR=jug.getY()+8;
        return new Point((int)xR,(int)yR);
    }

    private int contrariosCerca(Point cont,int[] mios){
        int mejor=999;
        int dist;
        int nJug=0;
        for (int m=0;m<mios.length;m++){
            dist=distanciaJugadores(cont,mios[m]);
            if(dist<mejor && !ocupado.contains((int)mios[m])){
                mejor=dist;
                nJug=m;
            }
        }
        ocupado.add((int)mios[nJug]);
        return mios[nJug];
    }
    
    private int distanciaJugadores(Point cont,int mio){
        return (int)actualMios[mio].distance(cont);
    }
}

